#pragma once
#include <iostream>
#include <unordered_map>
#include <fstream>

static char opers[] = "+-*/";

enum
{
    DivZero = 1,
    ModZero,
    Unknown
};

// class task
// {
// public:
//     task()
//         :_result(0)
//         ,_exitcode(0)
//     {}

//     void Run()
//     {
//         char buffer[1024];
//         int n=read(_sockfd,buffer,sizeof(buffer));

//         // switch(_oper)
//         // {
//         //     case '+':_result=_data1+_data2;
//         //     break;
//         //     case '-':_result=_data1-_data2;
//         //     break;
//         //     case '*':_result=_data1*_data2;
//         //     break;
//         //     case '/':
//         //     if(_data2==0) _exitcode=DivZero;
//         //     else _result=_data1/_data2;
//         //     break;
//         //     default :_exitcode=Unknown;
//         //     break;
//         // }
//     }

//     std::string GetResult()
//     {
//         std::string r = std::to_string(_data1);
//         r += _oper;
//         r += std::to_string(_data2);
//         r += "=";
//         r += std::to_string(_result);
//         r += "[code: ";
//         r += std::to_string(_exitcode);
//         r += "]";
//         return r;
//     }
//     std::string GetTask()
//     {
//         std::string r = std::to_string(_data1);
//         r += _oper;
//         r += std::to_string(_data2);
//         r += "=?";
//         return r;
//     }

// private:
//     int _data1;
//     int _data2;
//     char _oper;
//     int _result;
//     int _exitcode;
// };

bool Split(string &buffer, string &part1, string &part2)
{
    int index = buffer.find(':'); // 找到后返回:的下标位置
    if (index == string::npos)
    {
        return false;
    }
    part1 = buffer.substr(0, index);
    // part2=buffer.substr(index+1,buffer.size());
    part2 = buffer.substr(index + 1);
    return true;
}

// 实现字典翻译
class Diction
{
public:
    Diction()
    {
        // 打开文件，将数据导入map
        ifstream in("dict.txt");
        string buffer;
        // in.open("dict.txt",ios::in);
        if (!in.is_open())
        {
            cout << "Error opening file" << endl;
            exit(-4);
        }
        // 读取失败返回false
        while (getline(in, buffer))
        {
            string part1, part2;
            Split(buffer, part1, part2);
            // 插入数据库
            _Data.insert(make_pair(part1, part2));
        }
        in.close();
    }
    string Tranlator(string buffer)
    {
        // 从记事本中查找
        cout<<buffer<<endl;
        auto it = _Data.find(buffer);
        if (it == _Data.end())
        {
            return "nullptr";
        }
        // 找到后将结果返回
        return it->second;
    }

private:
    unordered_map<string, string> _Data;
};

Diction dic;
class task
{
public:
    task(int fd, string clientip, uint16_t clientport)
        : _clientip(clientip), _clientport(clientport), _sockfd(fd)
    {
    }

    void Run()
    {
        while(1)
        {
            char buffer[4096];
            memset(buffer,0,sizeof(buffer));
            int n = read(_sockfd, buffer, sizeof(buffer));
            if (n > 0)
            {
                string result = dic.Tranlator(buffer);
                int n1 = write(_sockfd, result.c_str(), result.size());
                if (n1 < 0)
                {
                    lg(Fatal, "write error, errno : %d, errstring: %s", errno, strerror(errno));
                    exit(-5);
                }
            }
        }
        close(_sockfd);
    }

    std::string GetResult()
    {
    }
    std::string GetTask()
    {
    }

private:
    string _clientip;
    uint16_t _clientport;
    int _sockfd;
};
